package me.yushuai.wukong.base.service.impl;

import me.yushuai.wukong.base.api.dto.ConfigDefinitionDTO;
import me.yushuai.wukong.base.api.dto.ConfigValueDTO;
import me.yushuai.wukong.base.api.dto.CreateConfigDTO;
import me.yushuai.wukong.base.convertor.ConfigDefinitionConvertor;
import me.yushuai.wukong.base.entity.ConfigDefinition;
import me.yushuai.wukong.base.entity.ConfigValue;
import me.yushuai.wukong.base.repository.ConfigDefinitionRepository;
import me.yushuai.wukong.base.repository.ConfigValueRepository;
import me.yushuai.wukong.base.service.ConfigDefinitionService;
import me.yushuai.wukong.common.exceptin.BizIdNotExistException;
import me.yushuai.wukong.common.exceptin.DuplicateBizIdException;
import org.springframework.beans.factory.annotation.Autowired;

import java.util.List;
import java.util.Objects;

/**
 * @author zhoushuai@189.cn
 * @since 2023-04-03
 */
public class ConfigDefinitionServiceImpl implements ConfigDefinitionService {

    @Autowired
    private ConfigValueRepository configValueRepository;

    @Autowired
    private ConfigDefinitionRepository configDefinitionRepository;

    @Autowired
    private ConfigDefinitionConvertor configDefinitionConvertor;


    @Override
    public void createConfig(CreateConfigDTO dto) throws DuplicateBizIdException {

        //1. 检查业务Id是否已经存在
        final String bizId = dto.getBizId();
        final String group = dto.getGroup();
        if (this.configDefinitionRepository.existsByBizIdAndGroup(bizId, group)) {
            String fullBizId = group + ":" + bizId;
            throw new DuplicateBizIdException(fullBizId, ConfigDefinition.class);
        }

        //2. 新增配置定义信息
        ConfigDefinition configDefinition = this.configDefinitionConvertor.mapToConfigDefinition(dto);
        this.configDefinitionRepository.save(configDefinition);

        //3. 新增结果列表
        final List<ConfigValueDTO> values = dto.getValues();
        if (Objects.isNull(values) || values.isEmpty()) {
            return;
        }

        //4. 批量新增配置项的所有可选值
        List<ConfigValue> configValues = this.configDefinitionConvertor.mapToConfigValues(values);
        for (ConfigValue configValue : configValues) {
            configValue.setConfDefId(configDefinition.getId());
        }
        this.configValueRepository.saveAll(configValues);
    }

    @Override
    public ConfigDefinitionDTO findByBizId(String bizId) throws BizIdNotExistException {
        final ConfigDefinition confDef = this.configDefinitionRepository.findByBizId(bizId)
                .orElseThrow(() -> new BizIdNotExistException(bizId, ConfigDefinition.class));

        List<ConfigValue> configValues = this.configValueRepository.findAllByConfDefBizId(bizId);
        List<ConfigValueDTO> configValueDTOList =  this.configDefinitionConvertor.mapToConfigValueDTOList(configValues);

        ConfigDefinitionDTO dto = new ConfigDefinitionDTO();
        return this.configDefinitionConvertor.mapToConfigDefinitionDTO(confDef, configValueDTOList);
    }
}
